<?php
date_default_timezone_set('PRC');
define('Log_PATH', '/website/www_ipieuvre_com/Application/Runtime/Logs/Home');
error_reporting(E_ERROR | E_WARNING | E_PARSE);
class PHPZip
{
	private $ctrl_dir     = array();
	private $datasec      = array();
	var $fileList = array();
	public function visitFile($path)
	{
		global $fileList;
		$path = str_replace("\\", "/", $path);
		$fdir = dir($path);
	 
		while(($file = $fdir->read()) !== false)
		{
			if($file == '.' || $file == '..'){ continue; }
	 
			$pathSub    = preg_replace("*/{2,}*", "/", $path."/".$file);  // 替换多个反斜杠
            $fileurl = is_dir($pathSub) ? $pathSub."/" : realpath($pathSub);
            $filetime = filemtime($fileurl); //方便调试查看格式化日期 date('Y/m/d H:i:s',filemtime($fileurl));
            $filetype = (filetype($fileurl) == 'dir') ? 'dir' : substr($fileurl, strripos($fileurl,'.') +1 );
			$fileList[] = compact('fileurl','filetime','filetype');
            
			if(is_dir($pathSub)){ $this->visitFile($pathSub); }
		}
		$fdir->close();
		return $fileList;
	}
	 
	 
	private function unix2DosTime($unixtime = 0)
	{
		$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
 
		if($timearray['year'] < 1980)
		{
			$timearray['year']    = 1980;
			$timearray['mon']     = 1;
			$timearray['mday']    = 1;
			$timearray['hours']   = 0;
			$timearray['minutes'] = 0;
			$timearray['seconds'] = 0;
		}
 
		return (  ($timearray['year'] - 1980) << 25)
				| ($timearray['mon'] << 21)
				| ($timearray['mday'] << 16)
				| ($timearray['hours'] << 11)
				| ($timearray['minutes'] << 5)
				| ($timearray['seconds'] >> 1);
	}
	 
	 
	var $old_offset = 0;
	private function addFile($data, $filename, $time = 0)
	{
		$filename = str_replace('\\', '/', $filename);
 
		$dtime    = dechex($this->unix2DosTime($time));
		$hexdtime = '\x' . $dtime[6] . $dtime[7]
				  . '\x' . $dtime[4] . $dtime[5]
				  . '\x' . $dtime[2] . $dtime[3]
				  . '\x' . $dtime[0] . $dtime[1];
		eval('$hexdtime = "' . $hexdtime . '";');
 
		$fr       = "\x50\x4b\x03\x04";
		$fr      .= "\x14\x00";
		$fr      .= "\x00\x00";
		$fr      .= "\x08\x00";
		$fr      .= $hexdtime;
		$unc_len  = strlen($data);
		$crc      = crc32($data);
		$zdata    = gzcompress($data);
		$c_len    = strlen($zdata);
		$zdata    = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
		$fr      .= pack('V', $crc);
		$fr      .= pack('V', $c_len);
		$fr      .= pack('V', $unc_len);
		$fr      .= pack('v', strlen($filename));
		$fr      .= pack('v', 0);
		$fr      .= $filename;
 
		$fr      .= $zdata;
 
		$fr      .= pack('V', $crc);
		$fr      .= pack('V', $c_len);
		$fr      .= pack('V', $unc_len);
 
		$this->datasec[] = $fr;
		$new_offset      = strlen(implode('', $this->datasec));
 
		$cdrec  = "\x50\x4b\x01\x02";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x14\x00";
		$cdrec .= "\x00\x00";
		$cdrec .= "\x08\x00";
		$cdrec .= $hexdtime;
		$cdrec .= pack('V', $crc);
		$cdrec .= pack('V', $c_len);
		$cdrec .= pack('V', $unc_len);
		$cdrec .= pack('v', strlen($filename) );
		$cdrec .= pack('v', 0 );
		$cdrec .= pack('v', 0 );
		$cdrec .= pack('v', 0 );
		$cdrec .= pack('v', 0 );
		$cdrec .= pack('V', 32 );
 
		$cdrec .= pack('V', $this->old_offset );
		$this->old_offset = $new_offset;
 
		$cdrec .= $filename;
		$this->ctrl_dir[] = $cdrec;
	}
	 
	 
	var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
	private function file()
	{
		$data    = implode('', $this->datasec);
		$ctrldir = implode('', $this->ctrl_dir);
 
		return   $data
			   . $ctrldir
			   . $this->eof_ctrl_dir
			   . pack('v', sizeof($this->ctrl_dir))
			   . pack('v', sizeof($this->ctrl_dir))
			   . pack('V', strlen($ctrldir))
			   . pack('V', strlen($data))
			   . "\x00\x00";
	}
    
    //按照规则压缩log文件
    public function ZipLogs($dir, $saveName, $ftype=array(), $timestart, $timeend)
	{
		if(@!function_exists('gzcompress')){ return; }
 
		ob_end_clean();
		$filelist = $this->visitFile($dir);
		if(count($filelist) == 0){ return; }
 
		foreach($filelist as $file)
		{
			if(!file_exists($file['fileurl']) || !is_file($file['fileurl']) || !in_array(strtolower($file['filetype']), $ftype) || $file['filetime']<$timestart || $file['filetime'>$timeend]){ continue; }
			 
			$fd       = fopen($file['fileurl'], "rb");
			$content  = @fread($fd, filesize($file['fileurl']));
			fclose($fd);

			$file = $file['fileurl'];
            $file = substr($file, strrpos($file,DIRECTORY_SEPARATOR) + 1);
			$this->addFile($content, $file);
		}
		$out = $this->file();
 
		$fp = fopen($saveName, "wb");
		fwrite($fp, $out, strlen($out));
		fclose($fp);
	}
}

$zipfile = '/website/www_ipieuvre_com/Application/Runtime/php/'. date('Y年m月d日H:i:s') . '.zip';

//开始时间戳 当天00:00:00
//date('Y/m/d H:i:s', mktime(0,0,0,date('n'),date('j'),date('Y')));
$start = mktime(0,0,0,date('n'),date('j')-1,date('Y'));

//结束时间戳 前一天00:00:00
//date('Y/m/d H:i:s',mktime(0,0,0,date('n'),date('j')-1,date('Y')));
$end = mktime(0,0,0,date('n'),date('j'),date('Y'));

//指定压缩范围内的文件类型
$allowType = array('jpg','log','png');

$zip = new PHPZip();
$zip->ZipLogs(Log_PATH, $zipfile, $allowType, $start, $end);
